package com.example.demo.java8.functionalinterface.day240426;

import lombok.extern.slf4j.Slf4j;
/**
 *
 * 在了解 Lambda 表达式之前，先看这样一个需求：
 * 通过 Runnable 启动一个线程，并打印：线程已启动
 * 对于这样一个需求，有以下三种方式：
 *
 * 匿名内部类中重写 run() 方法的代码分析：
 *
 * 方法形式参数为空，说明调用方法时不需要传递参数
 * 方法返回值类型为 void，说明方法执行没有结果返回
 * 方法体中的内容，是我们具体要做的事情
 * Lambda 表达式的代码分析：
 *
 * ()：里面没有内容，可以看成是方法形式参数为空
 * ->：用箭头指向后面要做的事情
 * {}：包含一段代码，我们称之为代码块，可以看成是方法体中的内容
 * 由此可得知，组成 Lambda 表达式的三要素：形式参数、箭头、代码块。
 *
 * Lambda 表达式的格式：
 *
 * 格式：（形式参数）-> { 代码块 }
 * 形式参数：如果有多个参数，参数之间用逗号隔开；如果没有参数，留空即可
 * ->：由英文中画线和大于符号组成，固定写法，代表指向动作
 * 代码块：是我们具体要做的事情，也就是以前我们写的方法体内容
 * 1.2 使用前提
 * Lambda表达式的使用前提：
 *
 * 有一个接口
 * 接口中有且仅有一个抽象方法
 * 在 Runnable 的测试中，其 run()是一个无参数的方法，接下来我们按照上述前提来创建一个参数和多个参数的接口来实现 Lambda 表达式。
 *
 * 原文链接：https://blog.csdn.net/weixin_43477531/article/details/127213876
 *
 * @author luo
 * @since 2024/4/26 23:04
 */
@Slf4j
public class MyRunnable implements Runnable{
    @Override
    public void run() {
        log.info("线程已启动");
    }


    public static void main(String[] args) {
        //方式一实现 Runnable 接口，如下：
        MyRunnable myRunnable = new MyRunnable();
        Thread thread1 = new Thread(myRunnable);
        thread1.start();
        //方法二 匿名内部类
        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                log.info("线程已启动");
            }
        });
        thread2.start();
        //方法三 lambda表达式
        Thread thread3 = new Thread(()->{
            log.info("线程已启动");
        });
        thread3.start();
    }
}
